package app.displayTree.special.sub {
    import app.displayTree.analyze.DisplayTreeAnalyzeSupport;

    import copyengine.infoTree.meta.CESDisplayObjectMeta;

    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.describeType;

    public class SpecialSymbolHandleBasic {

        private var mSpecialSymbolKey:String;

        public function SpecialSymbolHandleBasic() {
        }

        public final function tryToGenerateSpecialSymbolMeta(_symbol:Sprite, _support:DisplayTreeAnalyzeSupport):CESDisplayObjectMeta {
            if (isSpecialSymbol(_symbol)) {
                return doGenerateSpecialSymbolMeta(_symbol, _support);
            }
            return null;
        }

        public final function tryToPushSpecialSymbol(_symbolKey:String, _symbol:DisplayObject):Boolean {
            if (isCanHandleThisSpecialSymbolKey(_symbolKey)) {
                mSpecialSymbolKey = _symbolKey;
                initialize(_symbolKey, _symbol);
                return true;
            }
            return false;
        }

        /**
         * 返回一个Sprite在FLA库中导出类的名字(即使给Mc起了别名 也不影响其库中的名字 即使没有导出)
         */
        protected final function getMcAs3ExportName(_mc:Sprite):String {
            var type:XML = describeType(_mc);
            var name:String = type.@name;
            return name;
        }

        //============================================//
        //==OverrideAble  Function
        //============================================//

        protected function initialize(_symbolKey:String, _symbol:DisplayObject):void {}

        /**
         * 每一个Special的Mc
         *
         * 1· 本身都是导出类
         * 2· 导出类的名字含有特定意义 比如 PH_开头 S3_开头 等等
         *
         * 子类需要Override该函数判断某一个导出类名字是否为自己可以Handle的特殊Mc类型
         */
        protected function isCanHandleThisSpecialSymbolKey(_symbolKey:String):Boolean { return false; }

        /**
         * 用于在上层遍历中判断某一个Mc是否是一个特殊的Mc 默认是判断其Library中的名字是否和初始化时候
         * 设置的特殊关键字相同,比如PH系列 当在库中创建一个元件叫PH_Avatar 那在使用的时候就把这个元件
         * 拖入舞台然后调整其大小和旋转 此时给该PH_Avatar起别名叫iconPH 但是起Library的名字会一直是PH_Avatar
         *
         * 但是对已S3 和 S9 系列 特殊元件的名字为S3_GreenButtonBg 但是使用的时候会在库中创建一个新的元件 调整好大小后
         * 以GreenButtonBg_为开头 比如叫 GreenButtonBg_A1, GreenButtonBg_A2这样 此时就要Override这个方法进行特殊的判断
         */
        protected function isSpecialSymbol(_symbol:Sprite):Boolean {
            return getMcAs3ExportName(_symbol) == mSpecialSymbolKey;
        }

        protected function doGenerateSpecialSymbolMeta(_symbol:Sprite, _support:DisplayTreeAnalyzeSupport):CESDisplayObjectMeta { return null; }

    }
}
